package com.dreamwhale.accelerator.common;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
 * @ClassName: ShoppingResult.java
 * @Description: 自定义响应结构
 * @Author: qcg
 * @Date: 2017年11月30日下午4:45:28
 */
public class DataResult {

    // 定义jackson对象
    private static final ObjectMapper MAPPER = new ObjectMapper();

    // 响应业务状态
    private Integer status;

    // 响应消息
    private String msg;

    // 响应中的数据
    private Object data;

    public static  com.dreamwhale.accelerator.common.DataResult build(Integer status, String msg, Object data) {
        return new  com.dreamwhale.accelerator.common.DataResult(status, msg, data);
    }

    public static  com.dreamwhale.accelerator.common.DataResult ok(Object data) {
        return new  com.dreamwhale.accelerator.common.DataResult(data);
    }

    public static  com.dreamwhale.accelerator.common.DataResult ok() {
        return new  com.dreamwhale.accelerator.common.DataResult(null);
    }

    public DataResult() {

    }

    public static  com.dreamwhale.accelerator.common.DataResult build(Integer status, String msg) {
        return new  com.dreamwhale.accelerator.common.DataResult(status, msg, null);
    }

    public DataResult(Integer status, String msg, Object data) {
        this.status = status;
        this.msg = msg;
        this.data = data;
    }

    public DataResult(Object data) {
        this.status = 200;
        this.msg = "OK";
        this.data = data;
    }

//    public Boolean isOK() {
//        return this.status == 200;
//    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    /**
     * 将json结果集转化为FinanceResult对象
     * 
     * @param jsonData json数据
     * @param clazz TaotaoResult中的object类型
     * @return
     */
    public static  com.dreamwhale.accelerator.common.DataResult formatToPojo(String jsonData, Class<?> clazz) {
        try {
            if (clazz == null) {
                return MAPPER.readValue(jsonData,  com.dreamwhale.accelerator.common.DataResult.class);
            }
            JsonNode jsonNode = MAPPER.readTree(jsonData);
            JsonNode data = jsonNode.get("data");
            Object obj = null;
            if (clazz != null) {
                if (data.isObject()) {
                    obj = MAPPER.readValue(data.traverse(), clazz);
                } else if (data.isTextual()) {
                    obj = MAPPER.readValue(data.asText(), clazz);
                }
            }
            return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 没有object对象的转化
     * 
     * @param json
     * @return
     */
    public static  com.dreamwhale.accelerator.common.DataResult format(String json) {
        try {
            return MAPPER.readValue(json,  com.dreamwhale.accelerator.common.DataResult.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Object是集合转化
     * 
     * @param jsonData json数据
     * @param clazz 集合中的类型
     * @return
     */
    public static  com.dreamwhale.accelerator.common.DataResult formatToList(String jsonData, Class<?> clazz) {
        try {
            JsonNode jsonNode = MAPPER.readTree(jsonData);
            JsonNode data = jsonNode.get("data");
            Object obj = null;
            if (data.isArray() && data.size() > 0) {
                obj = MAPPER.readValue(data.traverse(),
                        MAPPER.getTypeFactory().constructCollectionType(List.class, clazz));
            }
            return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
        } catch (Exception e) {
            return null;
        }
    }

    /**
	 * 商品id生成
	 */
	public static long genItemId() {
		//取当前时间的长整形值包含毫秒
		long millis = System.currentTimeMillis();
		//long millis = System.nanoTime();
		//加上两位随机数
		Random random = new Random();
		int end2 = random.nextInt(99);
		//如果不足两位前面补0
		String str = millis + String.format("%02d", end2);
		long id = new Long(str);
		return id;
	}
    
	/**
	 * 获取订单ID
	 * @return
	 */
	public static String getOrderCode() {
		// 取当前时间的长整形值包含毫秒
		Long dateString = new Date().getTime();
		// 获取三位随机数
		Random random = new Random();
		int end = random.nextInt(999);
		// 商户订单号生成规则:+ 时间的长整型
		String str = "TRADER" + dateString + end;
		return str;
	}
	
	/**
	 * 用户升级会员卡
	 * @return
	 */
	public static String getMemberPayCode() {
		// 取当前时间的长整形值包含毫秒
		Long dateString = new Date().getTime();
		// 获取三位随机数
		Random random = new Random();
		int end = random.nextInt(999);
		// 商户订单号生成规则:+ 时间的长整型
		String str = "UM" + dateString + end;
		return str;
	}

	/**
	 * 用户升级会员卡
	 * @return
	 */
	public static String getTraderPayCode() {
		// 取当前时间的长整形值包含毫秒
		Long dateString = new Date().getTime();
		// 获取三位随机数
		Random random = new Random();
		int end = random.nextInt(999);
		// 商户订单号生成规则:+ 时间的长整型
		String str = "UTP" + dateString + end;
		return str;
	}

	/**
	 * 用户升级会员卡
	 * @return
	 */
	public static String getRiderPayCode() {
		// 取当前时间的长整形值包含毫秒
		Long dateString = new Date().getTime();
		// 获取三位随机数
		Random random = new Random();
		int end = random.nextInt(999);
		// 商户订单号生成规则:+ 时间的长整型
		String str = "URP" + dateString + end;
		return str;
	}
	
	/**
	 * 获取跑腿订单ID
	 * @return
	 */
	public static String getRunOrderCode() {
		// 取当前时间的长整形值包含毫秒
		Long dateString = new Date().getTime();
		// 获取三位随机数
		Random random = new Random();
		int end = random.nextInt(999);
		// 商户订单号生成规则:+ 时间的长整型
		String str = "REEANDS" + dateString + end;
		return str;
	}
	
	/**
	 * 生成管理员编号
	 * @return
	 */
	public static String getPromoteCode() {
		// 取当前时间的长整形值包含毫秒
		Long dateString = new Date().getTime();
		// 商户订单号生成规则:+ 时间的长整型
		String str = "GK" + String.valueOf(dateString).substring(5);
		return str;
	}



	public static String createXML(Map<String, String> map, String s) throws UnsupportedEncodingException {
	    StringBuilder xml = new StringBuilder("<xml>");
	    for (Map.Entry<String, String> entry : map.entrySet()) {
	        String key = entry.getKey();
	        String val = entry.getValue();
	        xml.append("<").append(key).append(">").append(val).append("</").append(key).append(">");
	    }
	    xml.append("<").append("sign").append(">").append(s).append("</").append("sign").append(">");
	    xml.append("</xml>");
	    String xml1=xml.toString();
	    return xml1;
	}
}
